<?php

/**
 * Description of XQL_Action
 *
 * @author prometheus
 */
class XQL_Action extends x10_GeneralClass
{
	/**
	 * @var XQL_Object
	 */
	protected $xqlQuery;

	/**
	 * @var XQL_Pager
	 */
	protected $xqlPager;

	/**
	 * @var XQL_Limit
	 */
	protected $prevLimitInstance;

	public function __construct(x10_Config $config=NULL)
	{
		parent::__construct($config);
	}

	/**
	 * @return XQL_Action
	 */
	public static function create()
	{
		return new XQL_Action();
	}

	/**
	 * Beállítja az akcióhoz tartozó lekérést.
	 * @param XQL_Object $query
	 * @return XQL_Action
	 */
	public function setQuery(XQL_Object $query)
	{
		$this->xqlQuery = $query;
		return $this;
	}

	/**
	 * Visszaadja a beállított XQL lekérést.
	 * @return XQL_Object
	 */
	public function getQuery()
	{
		return $this->xqlQuery;
	}

	/**
	 * Lapozót csatol az akcióhoz.
	 * @param XQL_Pager $pager
	 */
	public function attachPager(XQL_Pager $pager)
	{
		$this->xqlPager = $pager;
		
		if (isset($this->xqlQuery->limit))
		{
			$this->prevLimitInstance = $this->xqlQuery->limit->detach(TRUE);
		}

		$this->xqlQuery->join($this->xqlPager->xqlLimit);
	}

	/**
	 * Eltávolítja a csatolt lapozót és visszaállítja a korábbi LIMIT (és OFFSET)
	 * kritériát, ha volt megadva.
	 */
	public function detachPager()
	{
		$this->xqlQuery->limit->detach();
		
		if (isset($this->prevLimitInstance))
		{
			$this->xqlQuery->join($this->prevLimitInstance);
		}
		
		$this->xqlPager = NULL;
	}

	/**
	 * Visszaadja a csatolt lapozó objektumot.
	 * @return XQL_Pager
	 */
	public function getPager()
	{
		return $this->xqlPager;
	}

	public function prepare()
	{
		$cn = x10::dedicate('XQL_Connection_DatabaseManager')->getActive();
		$cn->setResultingAction($this);
		return $cn->prepare((string)$this->xqlQuery);
	}
}

?>